home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / examples / linedraw.s < prev    next >
Text File  |  1991-10-24  |  7KB  |  319 lines

  1. ;************************************************
  2. ;*       Non-System Draw Line Example        *
  3. ;*    Made as help to demo and game creaters    *
  4. ;*                        *
  5. ;*  ASM-One example coded by Rune Gram-Madsen    *
  6. ;*                        *
  7. ;*   All rights reserved. Copyright (c) 1990    *
  8. ;************************************************
  9.  
  10. ; Move the mouse around to draw a lot of lines.
  11.  
  12. ;*****************
  13. ;*   Constants   *
  14. ;*****************
  15.  
  16. OldOpenLibrary    = -408
  17. CloseLibrary    = -414
  18.  
  19. DMASET=    %1000000111000000
  20. ;     -----a-bcdefghij
  21.  
  22. ;    a: Blitter Nasty
  23. ;    b: Bitplane DMA (if this isn't set, sprites disappear!)
  24. ;    c: Copper DMA
  25. ;    d: Blitter DMA
  26. ;    e: Sprite DMA
  27. ;    f: Disk DMA
  28. ;    g-j: Audio 3-0 DMA
  29.  
  30. START:
  31.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  32.  
  33. ;***********************************
  34. ;*   CLOSE ALL SYSTEM INTERRUPTS   *
  35. ;*                                 *
  36. ;*      START DEMO INTERRUPTS      *
  37. ;***********************************
  38.  
  39.     MOVE.L    $4.W,A6            ; Exec pointer to A6
  40.     LEA.L    GfxName(PC),A1        ; Set library pointer
  41.     MOVEQ    #0,D0
  42.     JSR    OldOpenLibrary(A6)    ; Open graphics.library
  43.     MOVE.L    D0,A1            ; Use Base-pointer
  44.     MOVE.L    $26(A1),OLDCOP1        ; Store copper1 start addr
  45.     MOVE.L    $32(A1),OLDCOP2        ; Store copper1 start addr
  46.     JSR    CloseLibrary(A6)    ; Close graphics library
  47.  
  48.     LEA    $DFF000,A6
  49.     MOVE.W    $1C(A6),INTENA        ; Store old INTENA
  50.     MOVE.W    $2(A6),DMACON        ; Store old DMACON
  51.     MOVE.W    $10(A6),ADKCON        ; Store old ADKCON
  52.  
  53.     MOVE.W    #$7FFF,$9A(A6)        ; Clear interrupt enable
  54.  
  55.     BSR.L    Wait_Vert_Blank
  56.  
  57.     MOVE.W    #$7FFF,$96(A6)        ; Clear DMA channels
  58.     MOVE.L    #COPLIST,$80(A6)    ; Copper1 start address
  59.     MOVE.W    #DMASET!$8200,$96(A6)    ; DMA kontrol data
  60.     MOVE.L    $6C.W,OldInter        ; Store old inter pointer
  61.     MOVE.L    #INTER,$6C.W        ; Set interrupt pointer
  62.  
  63.     MOVE.W    #$7FFF,$9C(A6)        ; Clear request
  64.     MOVE.W    #$C020,$9A(A6)        ; Interrupt enable
  65.  
  66. ;****       Your main routine      ****
  67.  
  68.  
  69. ;**** Main Loop  Test mouse button ****
  70.  
  71. LOOP:
  72.     BTST    #6,$BFE001        ; Test left mouse button
  73.     BNE.S    LOOP
  74.  
  75. ;*****************************************
  76. ;*                     *
  77. ;*   RESTORE SYSTEM INTERRUPTS ECT ECT   *
  78. ;*                     *
  79. ;*****************************************
  80.  
  81.     LEA    $DFF000,A6
  82.  
  83.     MOVE.W    #$7FFF,$9A(A6)        ; Disable interrupts
  84.  
  85.     BSR.S    Wait_Vert_Blank
  86.  
  87.     MOVE.W    #$7FFF,$96(A6)
  88.     MOVE.L    OldCop1(PC),$80(A6)    ; Restore old copper1
  89.     MOVE.L    OldCop2(PC),$84(A6)    ; Restore old copper1
  90.     MOVE.L    OldInter(PC),$6C.W    ; Restore inter pointer
  91.     MOVE.W    DMACON,D0        ; Restore old DMACON
  92.     OR.W    #$8000,D0
  93.     MOVE.W    D0,$96(A6)        
  94.     MOVE.W    ADKCON,D0        ; Restore old ADKCON
  95.     OR.W    #$8000,D0
  96.     MOVE.W    D0,$9E(A6)
  97.     MOVE.W    INTENA,D0        ; Restore inter data
  98.     OR.W    #$C000,D0
  99.     MOVE.W    #$7FFF,$9C(A6)
  100.     MOVE.W    D0,$9A(A6)
  101.     MOVEM.L    (A7)+,D0-D7/A0-A6    ; Get registers from stack
  102.     RTS
  103.  
  104. ;*** WAIT VERTICAL BLANK ***
  105.  
  106. Wait_Vert_Blank:
  107.     BTST    #0,$5(A6)
  108.     BEQ.S    Wait_Vert_Blank
  109. .loop    BTST    #0,$5(A6)
  110.     BNE.S    .loop
  111.     RTS
  112.  
  113. ;*** DATA AREA ***
  114.  
  115. GfxName        DC.B    'graphics.library',0
  116.         even
  117. DosBase        DC.L    0
  118. OldInter    DC.L    0
  119. OldCop1        DC.L    0
  120. OldCop2        DC.L    0
  121. INTENA        DC.W    0
  122. DMACON        DC.W    0
  123. ADKCON        DC.W    0
  124.  
  125. ;**********************************
  126. ;*                  *
  127. ;*    INTERRUPT ROUTINE. LEVEL 3  *
  128. ;*                  *
  129. ;**********************************
  130.  
  131. INTER:
  132.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  133.     LEA.L    $DFF000,A6
  134.     MOVE.L    #SCREEN,$E0(A6)
  135.  
  136. ;---  Place your interrupt routine here  ---
  137.  
  138.     BSR.S    INITLINE    ; Init line registers
  139.  
  140.     MOVEQ    #0,D0        ; Start X - Y coords
  141.     MOVEQ    #0,D1
  142.  
  143.     MOVEQ    #0,D3        ; End X - Y coords
  144.     MOVEQ    #0,D2
  145.  
  146.     MOVE.W    $A(a6),D3    ; Get mouse position
  147.     MOVE.B    D3,D2
  148.     LSR.W    #8,D3
  149.  
  150.     BSR.S    DRAWLINE    ; Draw the line
  151.  
  152.     MOVE.W    #$4020,$9C(A6)        ; Clear interrupt request
  153.     MOVEM.L    (A7)+,D0-D7/A0-A6    ; Get registers from stack
  154.     RTE
  155.  
  156. ;********************
  157. ;*  Init line draw  *
  158. ;********************
  159.  
  160. SINGLE = 0        ; 2 = SINGLE BIT WIDTH
  161. BYTEWIDTH = 40
  162.  
  163. ; The below registers only have to be set once each time
  164. ; you want to draw one or more lines.
  165.  
  166. INITLINE:
  167.     LEA.L    $DFF000,A6
  168.  
  169. .WAIT:    BTST    #$E,$2(A6)
  170.     BNE.S    .WAIT
  171.  
  172.     MOVEQ    #-1,D1
  173.     MOVE.L    D1,$44(A6)        ; FirstLastMask
  174.     MOVE.W    #$8000,$74(A6)        ; BLT data A
  175.     MOVE.W    #BYTEWIDTH,$60(A6)    ; Tot.Screen Width
  176.     MOVE.W    #$FFFF,$72(A6)
  177.     LEA.L    SCREEN,A5
  178.     RTS
  179.  
  180. ;*****************
  181. ;*   DRAW LINE   *
  182. ;*****************
  183.  
  184. ; USES D0/D1/D2/D3/D4/D7/A5/A6
  185.  
  186. DRAWLINE:
  187.     SUB.W    D3,D1
  188.     MULU    #40,D3        ; ScreenWidth * D3
  189.  
  190.     MOVEQ    #$F,D4
  191.     AND.W    D2,D4        ; Get lowest bits from D2
  192.  
  193. ;--------- SELECT OCTANT ---------
  194.  
  195.     SUB.W    D2,D0
  196.     BLT.S    DRAW_DONT0146
  197.     TST.W    D1
  198.     BLT.S    DRAW_DONT04
  199.  
  200.     CMP.W    D0,D1
  201.     BGE.S    DRAW_SELECT0
  202.     MOVEQ    #$11+SINGLE,D7        ; Select Oct 4
  203.     BRA.S    DRAW_OCTSELECTED
  204. DRAW_SELECT0:
  205.     MOVEQ    #1+SINGLE,D7        ; Select Oct 0
  206.     EXG    D0,D1
  207.     BRA.S    DRAW_OCTSELECTED
  208.  
  209. DRAW_DONT04:
  210.     NEG.W    D1
  211.     CMP.W    D0,D1
  212.     BGE.S    DRAW_SELECT1
  213.     MOVEQ    #$19+SINGLE,D7        ; Select Oct 6
  214.     BRA.S    DRAW_OCTSELECTED
  215. DRAW_SELECT1:
  216.     MOVEQ    #5+SINGLE,D7        ; Select Oct 1
  217.     EXG    D0,D1
  218.     BRA.S    DRAW_OCTSELECTED
  219.  
  220.  
  221. DRAW_DONT0146:
  222.     NEG.W    D0
  223.     TST.W    D1
  224.     BLT.S    DRAW_DONT25
  225.     CMP.W    D0,D1
  226.     BGE.S    DRAW_SELECT2
  227.     MOVEQ    #$15+SINGLE,D7        ; Select Oct 5
  228.     BRA.S    DRAW_OCTSELECTED
  229. DRAW_SELECT2:
  230.     MOVEQ    #9+SINGLE,D7        ; Select Oct 2
  231.     EXG    D0,D1
  232.     BRA.S    DRAW_OCTSELECTED
  233. DRAW_DONT25:
  234.     NEG.W    D1
  235.     CMP.W    D0,D1
  236.     BGE.S    DRAW_SELECT3
  237.     MOVEQ    #$1D+SINGLE,D7        ; Select Oct 7
  238.     BRA.S    DRAW_OCTSELECTED
  239. DRAW_SELECT3:
  240.     MOVEQ    #$D+SINGLE,D7        ; Select Oct 3
  241.     EXG    D0,D1
  242.  
  243. ;---------   CALCULATE START   ---------
  244.  
  245. DRAW_OCTSELECTED:
  246.     ADD.W    D1,D1            ; 2*dy
  247.     ASR.W    #3,D2            ; x=x/8
  248.     EXT.L    D2
  249.     ADD.L    D2,D3            ; d3 = x+y*40 = screen pos
  250.     MOVE.W    D1,D2            ; d2 = 2*dy
  251.     SUB.W    D0,D2            ; d2 = 2*dy-dx
  252.     BGE.S    DRAW_DONTSETSIGN
  253.     ORI.W    #$40,D7            ; dx < 2*dy
  254. DRAW_DONTSETSIGN:
  255.  
  256. ;---------   SET BLITTER   ---------
  257.  
  258. .WAIT:
  259.     BTST    #$E,$2(A6)        ; Wait on the blitter
  260.     BNE.S    .WAIT
  261.  
  262.     MOVE.W    D2,$52(A6)        ; 2*dy-dx
  263.     MOVE.W    D1,$62(A6)        ; 2*d2
  264.     SUB.W    D0,D2            ; d2 = 2*dy-dx-dx
  265.     MOVE.W    D2,$64(A6)        ; 2*dy-2*dx
  266.  
  267. ;---------   MAKE LENGTH   ---------
  268.  
  269.     ASL.W    #6,D0            ; d0 = 64*dx
  270.     ADD.W    #$0042,D0        ; d0 = 64*(dx+1)+2
  271.  
  272. ;---------   MAKE CONTROL 0+1   ---------
  273.  
  274.     ROR.W    #4,D4
  275.     ORI.W    #$BEA,D4        ; $B4A - DMA + Minterm
  276.     SWAP    D7
  277.     MOVE.W    D4,D7
  278.     SWAP    D7
  279.     ADD.L    A5,D3        ; SCREEN PTR
  280.  
  281.     MOVE.L    D7,$40(A6)        ; BLTCON0 + BLTCON1
  282.     MOVE.L    D3,$48(A6)        ; Source C
  283.     MOVE.L    D3,$54(A6)        ; Destination D
  284.     MOVE.W    D0,$58(A6)        ; Size
  285.     RTS
  286.  
  287. ;*****************************
  288. ;*                 *
  289. ;*      COPPER1 PROGRAM      *
  290. ;*                 *
  291. ;*****************************
  292.  
  293.     SECTION    Copper,DATA_C
  294.  
  295. COPLIST:
  296.     DC.W    $0100,$1200    ; Bit-Plane control reg.
  297.     DC.W    $0102,$0000    ; Hor-Scroll
  298.     DC.W    $0104,$0010    ; Sprite/Gfx priority
  299.     DC.W    $0108,$0000    ; Modolu (odd)
  300.     DC.W    $010A,$0000    ; Modolu (even)
  301.     DC.W    $008E,$2C81    ; Screen Size
  302.     DC.W    $0090,$2CC1    ; Screen Size
  303.     DC.W    $0092,$0038    ; H-start
  304.     DC.W    $0094,$00D0    ; H-stop
  305.  
  306.     DC.W    $0180,$0000    ; Color #0 = 000
  307.     DC.W    $0182,$0FFF    ; Color #1 = fff
  308.     DC.L    $FFFFFFFE
  309.  
  310. ;*****************************
  311. ;*                 *
  312. ;*      SCREEN DATA AREA     *
  313. ;*                 *
  314. ;*****************************
  315.  
  316.     SECTION    Screen,BSS_C
  317.  
  318. SCREEN    DS.B    40*256
  319.